package com.flying.test1;

import org.junit.jupiter.api.Test;

import java.io.Serializable;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author 刘鹏飞
 * @ClassName GenericMethodTest
 * @Date 2024/12/23 23:31
 * @Created by 刘鹏飞
 * @Description
 */
class GenericMethodTest {
    public static void main(String[] args) {

        GenericMethod genericMethod = new GenericMethod();

        genericMethod.setName("flying");  // 编译器自动根据传入的参数进行类型推断  -->  flying --- String  ->将String赋值给泛型参数


        Integer age = genericMethod.getAge(13);  // 自动装箱   int --> Integer
        System.out.println("age = " + age);





    }


    /**
     *  测试泛型方法中的可变参数
     */
    @Test
    public void test1(){

        GenericMethod genericMethod = new GenericMethod();

        genericMethod.getHobbies("打啦求",12,true);
    }


    /*
    测试泛型通配符 : ?  表示泛型通配符,代表具体的类型,它只能在 <> 中使用,可以解决具体类型不确定的问题
     */
    @Test
    public void test2(){
        ShowMsg showMsg = new ShowMsg();

        GenericClass<Integer> genericClass = new GenericClass<>();
        genericClass.setFlag(22);
        showMsg.showMsg(genericClass);

        GenericClass<Number> genericClass1 = new GenericClass<>();
        genericClass1.setFlag(66);
        showMsg.showMsg(genericClass1);

        GenericClass<String> genericClass2 = new GenericClass<>();
        genericClass2.setFlag("flying");
        showMsg.showMsg(genericClass2);
    }



    /*
    测试上限限定 :  实际类型可以是上限限定中所约定的类型，也可以是约定类型的子类型
     */
    @Test
    public void test3(){
        ShowMsg showMsg = new ShowMsg();


        // 给 <? extends Number> 传入 Integer
        GenericClass<Integer> genericClass = new GenericClass<>();
        genericClass.setFlag(20);
        showMsg.showMsgHigh(genericClass);

        //  传入  Number
        GenericClass<Number> genericClass1 = new GenericClass<>();
        genericClass1.setFlag(20);
        showMsg.showMsgHigh(genericClass1);


//        // 传入 Number上级对象
//        GenericClass<Object> genericClass2 = new GenericClass<>();
//        genericClass2.setFlag("你好");
//        showMsg.showMsgHigh(genericClass2);   报错

    }

    /**
     *  测试下限限定 :实际类型可以是下限限定中所约定的类型，也可以是约定类型的父类型；
     */
    @Test
    public void test4(){
        ShowMsg showMsg = new ShowMsg();

        // 下限本类
        GenericClass<Number> genericClass = new GenericClass<>();
        genericClass.setFlag(123);
        showMsg.showMsgLow(genericClass);


        // 下限父类:
        GenericClass<Object> genericClass1 = new GenericClass<>();
        genericClass1.setFlag(123);
        showMsg.showMsgLow(genericClass1);

        // 下限子类:
//        GenericClass<Integer> genericClass2 = new GenericClass<>();
//        genericClass2.setFlag(123);
//        showMsg.showMsgLow(genericClass2);   报错

    }

}